package com.hytc.dao.impl;

import com.hytc.utils.C3P0Util;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;


public class BaseDao {
    // 使用DBUtils
    private QueryRunner queryRunner = new QueryRunner();
    private Connection conn = null;

    /**
     * update方法：用来执行insert、update、delete语句
     * @param sql       sql语句
     * @param params    参数
     * @return  如果返回的是-1，执行失败,其他返回表示影响行数
     */
    public int update(String sql, Object... params){
        try {
            // 先创建数据库连接
            conn = C3P0Util.getConn();
            return queryRunner.update(conn, sql, params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return -1;
    }

    /**
     * 查询返回一个javaBean的sql语句方法
     * @param type      返回对象的类型
     * @param sql       sql语句
     * @param params    参数
     * @param <T>       指定类型
     * @return  返回的javaBean
     */
    public <T> T queryForOne(Class<T> type, String sql, Object... params){
        try {
            conn = C3P0Util.getConn();
            return queryRunner.query(conn, sql, new BeanHandler<T>(type), params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
    }

    /**
     * 查询返回多个javaBean的list
     * @param type      返回对象的类型
     * @param sql       sql语句
     * @param params    参数
     * @param <T>       指定类型
     * @return   返回一个集合，多个javaBean
     */
    public <T> List<T> queryForList (Class<T> type, String sql, Object... params){
        try {
            conn = C3P0Util.getConn();
            return queryRunner.query(conn, sql, new BeanListHandler<T>(type), params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
    }

    /**
     * 查询返回单个值的语句方法
     * @param sql       sql语句
     * @param params    参数
     * @return  返回单个值
     */
    public Object queryBySingleValue(String sql, Object... params) {
        try {
            conn = C3P0Util.getConn();
            return queryRunner.query(conn, sql, new ScalarHandler<>(), params);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(conn);
        }
        return null;
    }

    /**
     * 删除一个list
     * @param sql SQL语句
     * @param id
     * @param user_id 参数
     */
    public void deletecart(String sql,int id,int user_id) {
        try {
            conn = C3P0Util.getConn();
            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            preparedStatement.setInt(1, id);
            preparedStatement.setInt(2, user_id);

            int rowsdelete = preparedStatement.executeUpdate();
            if (rowsdelete > 0) {
                System.out.println("已删除一条记录");
            } else
                System.out.println("没有找到符合条件的记录");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
